﻿
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace MotoGame
{
    public class Colisao
    {
        // Os dados de cores para as imagens, usado para colisão por pixel
        Color[] dadosTexturaMoto1;////////////////////////
        Color[] dadosTexturaMoto2;///////////////////////
        // Posicao 
        Vector2 posicao1;//////////
        Vector2 posicao2;/////////

        string text1;
        string text2;

        Texture2D textura1;
        Texture2D textura2;

        Vector2 animacao;

        // Variavel para quando uma colisão for detectada
        public bool motoAtingida = false;

        public Colisao(ContentManager Content, string text1, string text2)
        {
            this.text1 = text1;
            this.text2 = text2;

            textura1 = Content.Load<Texture2D>(text1);
            textura2 = Content.Load<Texture2D>(text2);
        }

        public void Update(GameTime gameTime, Vector2 posicao1, Vector2 posicao2 , Vector2 animacao)
        {
            this.posicao1 = posicao1;
            this.posicao2 = posicao2;

            this.animacao = animacao;

            dadosTexturaMoto1 =  new Color[textura1.Width * textura1.Height];
            textura1.GetData(dadosTexturaMoto1);

            dadosTexturaMoto2 = new Color[textura2.Width * textura2.Height];
            textura2.GetData(dadosTexturaMoto2);

            // Define o retangulo delimitador  1
            Rectangle RetanguloMoto1 =
                new Rectangle((int)posicao1.X, (int)posicao1.Y,
                (int)animacao.X, (int)animacao.Y);

            // Define o retangulo delimitador 2
            Rectangle RetanguloMoto2 =
                new Rectangle((int)posicao2.X, (int)posicao2.Y,
                textura2.Width, textura2.Height);

            if (ColisaoPorPixel(RetanguloMoto1, dadosTexturaMoto1, RetanguloMoto2, dadosTexturaMoto2))
            {
                motoAtingida = true;
            }
            else
            {
                motoAtingida = false;
            }
            
        }

        // Determina se há sobreposição dos pixels não-transparentes entre os dois retangulos
        public bool ColisaoPorPixel(Rectangle retangulo1, Color[] dados1, Rectangle retangulo2, Color[] dados2)
        {
            // Encontra os limites do retangulo de interseção
            int cima = Math.Max(retangulo1.Top, retangulo2.Top);
            int baixo = Math.Min(retangulo1.Bottom, retangulo2.Bottom);
            int esquerda = Math.Max(retangulo1.Left, retangulo2.Left);
            int direita = Math.Min(retangulo1.Right, retangulo2.Right);

            // Verifica todos os pontos dentro do limite de intereseção 
            //TODO verificar se os retangulos estao um ao lado do outro
            for (int y = cima; y < baixo; y++)
            {
                for (int x = esquerda; x < direita; x++)
                {
                    // Verifica a cor de ambos os pixels neste momento
                    Color color1 = dados1[(x - retangulo1.Left) +
                    (y - retangulo1.Top) * retangulo1.Width];
                    Color color2 = dados2[(x - retangulo2.Left) +
                    (y - retangulo2.Top) * retangulo2.Width];

                    // Se ambos os píxels não são completamente diferentes
                    if (color1.A != 0 && color2.A != 0)
                    {
                        // Um cruzamento de pixel foi encontrado
                        return true;
                    }
                }
            }
            // Não foi encontrado cruzamento entre os pixels
            return false;
        }
    }
}
